using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Authentication.Cookies;
using Microsoft.AspNetCore.Authentication.JwtBearer;
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.HttpsPolicy;
using Microsoft.AspNetCore.Identity;
using Microsoft.AspNetCore.Identity.UI;
using Microsoft.AspNetCore.Mvc;
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.IdentityModel.Tokens;
using Swashbuckle.AspNetCore.Swagger;
using WebApplication8.Data;

namespace WebApplication8
{
  public class Startup
  {
    public Startup(IConfiguration configuration)
    {
      Configuration = configuration;
    }

    public IConfiguration Configuration { get; }

    // This method gets called by the runtime. Use this method to add services to the container.
    public void ConfigureServices(IServiceCollection services)
    {
      services.Configure<CookiePolicyOptions>(options =>
      {
        // This lambda determines whether user consent for non-essential cookies is needed for a given request.
        options.CheckConsentNeeded = context => true;
        options.MinimumSameSitePolicy = SameSiteMode.None;
      });

      services.AddAuthentication().AddCookie(CookieAuthenticationDefaults.AuthenticationScheme, d =>
      {
        d.LoginPath = "/api/login";
      });
      services.AddDbContext<ApplicationDbContext>(options =>
       options.UseSqlite(
         Configuration.GetConnectionString("DefaultConnection")));

      services.AddDefaultIdentity<ApplicationUser>(a =>
      {
        a.Password.RequiredLength = 1;
        a.Password.RequireDigit = false;
        a.Password.RequiredUniqueChars = 1;
        a.Password.RequireLowercase = false;
        a.Password.RequireNonAlphanumeric = false;
        a.Password.RequireUppercase = false;

      })
        .AddDefaultUI(UIFramework.Bootstrap4)

        .AddEntityFrameworkStores<ApplicationDbContext>();


      services.AddCors(options =>
        options.AddPolicy("nuxt", p =>
          p.WithOrigins("http://localhost:3000",
            "http://localhost:3001",
            "http://www.zhoulibin.cn")
          .AllowAnyMethod()
          .AllowAnyHeader()));

      services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2);

      services.AddSwaggerGen(options =>
      {
        options.SwaggerDoc("v1", new Info
        {
          Version = "v1",
          Title = "MsSystem API",
          Description = "A simple example ASP.NET Core Web API"
        });
      });

      services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
    }

    // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
    public void Configure(IApplicationBuilder app, IHostingEnvironment env)
    {
      if (env.IsDevelopment())
      {
        app.UseDeveloperExceptionPage();
        app.UseDatabaseErrorPage();
      }
      else
      {
        app.UseExceptionHandler("/Home/Error");
        // The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.
        app.UseHsts();
      }
      DefaultFilesOptions dfo = new DefaultFilesOptions();
      dfo.DefaultFileNames.Add("index.html");
      app.UseDefaultFiles(dfo);
      // app.UseHttpsRedirection();
      app.UseStaticFiles();
      app.UseCookiePolicy();

      app.UseAuthentication();
      app.UseCors("nuxt");
      app.UseMvc(routes =>
      {
        routes.MapRoute(
                name: "default",
                template: "{controller=Home}/{action=Index}/{id?}");
      });
      app.UseSwagger();
      app.UseSwaggerUI(c =>
      {
        c.SwaggerEndpoint("/swagger/v1/swagger.json", "MsSystem API V1");
      });
    }
  }
}